在前一天的文章中,我們理解了 Replication Controller 的運作,以及知道了利用Replication Controller 可以確保 pod 的運作效能符合我們的需求,但對於一些敏捷開開的場景、以及開發流程中常發生的滾動升級及回滾應用,有一個更好的控制器 Deployment
可以更符合我們的需求。
Replica Set被k8s譽為下一代的Replication controller,因其不止功能該有的都有,更有更為方便的 selector
spec.selector.matchLabels
:在 Replica Set的selector裡面提供了matchLabels
,Pod的labels必須與matchLabels
中指定的值相同,才算符合條件。spec.selector.matchExpressions
:matchExpressions
的用法較為彈性,每一筆條件主要由三個部分組成key
, operator
,value
;目前operator
支援4種條件In
, NotIn
, Exists
, 以及 DoesNotExis
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev]}
雖然 ReplicaSet 可以獨立使用,但一般還是建議使用 Deployment 来自動管理 ReplicaSet,這樣就無需擔心跟其他機制的不兼容问题
Deployment 為 pod和replica set提供聲明式更新
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2 # 告知 Deployment 運行 2 個 Pod
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
利用指令kubectl apply -f <YAML位置>
,便可以創建一個deployment,
而當我們要更新pod的時候,只需要更動YAML檔的內容之後,重新apply就可以了,如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
selector:
matchLabels:
app: nginx
replicas: 4 # 將副本數 2 更新為 4
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
並重新用 kubectl 去 apply,nginx 數量便會從 2 個變成 4 個;
若要刪除deployment,則下 kubectl delete deployment <meta.name>
就可以了!